์น ๋ธ๋ผ์ฐ์ ์์ ์ง์ ๊ณ ๊ธ ์ค์๊ฐ ๋น๋์ค ์กฐ์์ ์ํด WebCodecs VideoFrame์ ์ดํด๋ณด์ธ์. ๊ธฐ๋ฅ๊ณผ ๊ธ๋ก๋ฒ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ์์๋ณด์ธ์.
WebCodecs VideoFrame ์ฒ๋ฆฌ: ๋ธ๋ผ์ฐ์ ์์ ํ๋ ์ ๋จ์ ๋น๋์ค ์กฐ์์ ๊ฐ๋ฅ์ฑ ์ด๊ธฐ
์น ๊ธฐ๋ฐ ๋น๋์ค ํ๊ฒฝ์ ์ต๊ทผ ๋ช ๋
๋์ ํ์ ์ ์ธ ์งํ๋ฅผ ๊ฒช์์ต๋๋ค. ๋จ์ํ ์ฌ์์์ ๋ณต์กํ ๋ํํ ๊ฒฝํ๊น์ง, ๋น๋์ค๋ ์ด์ ๋์งํธ ์ธ๊ณ์ ํ์ ์์๊ฐ ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต๊ทผ๊น์ง ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ๊ณ ๊ธ ํ๋ ์ ๋จ์ ๋น๋์ค ์กฐ์์ ์ํํ๋ ๊ฒ์ ์๋นํ ๊ณผ์ ์์ผ๋ฉฐ, ์๋ฒ ์ธก ์ฒ๋ฆฌ ๋๋ ํน์ ํ๋ฌ๊ทธ์ธ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ์ด๋ WebCodecs์ ํนํ ๊ฐ๋ ฅํ VideoFrame ๊ฐ์ฒด์ ์ถํ์ผ๋ก ๋ชจ๋ ๋ฐ๋์์ต๋๋ค.
WebCodecs๋ ๊ฐ๋ฐ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ๊ณ ์ฑ๋ฅ์ ๋ง์ถคํ ๋ฏธ๋์ด ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์๋๋ก ๋ฏธ๋์ด ์ธ์ฝ๋ ๋ฐ ๋์ฝ๋์ ๋ํ ๋ฎ์ ์์ค์ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ํต์ฌ์ ์ผ๋ก VideoFrame ๊ฐ์ฒด๋ ๊ฐ๋ณ ๋น๋์ค ํ๋ ์์ ์ง์ ์ฐฝ์ ์ ๊ณตํ์ฌ ์ค์๊ฐ, ํด๋ผ์ด์ธํธ ์ธก ๋น๋์ค ์กฐ์์ ์ํ ๋ค์ํ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ VideoFrame ์ฒ๋ฆฌ๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง, ์์ฒญ๋ ์ ์ฌ๋ ฅ, ์ ์ธ๊ณ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฐ ํด๋น ๊ธฐ๋ฅ์ ํ์ฉํ๋ ๊ธฐ์ ์ ๋ณต์ก์ฑ์ ์์ธํ ์ดํด๋ณผ ๊ฒ์
๋๋ค.
๊ธฐ์ด: WebCodecs ๋ฐ VideoFrame ๊ฐ์ฒด ์ดํด
VideoFrame์ ์ฑ๋ฅ์ ์ดํดํ๋ ค๋ฉด WebCodecs API ๋ด์์ ํด๋น ์ปจํ
์คํธ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์
๋๋ค. WebCodecs๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ํ๋์จ์ด ๊ฐ์ ๋น๋์ค ์ธ์ฝ๋ ๋ฐ ๋์ฝ๋์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๋ฏธ๋์ด ๊ตฌ์ฑ ์์์ ์ํธ ์์ฉํ ์ ์๋๋ก ํ๋ ์ผ๋ จ์ JavaScript API์
๋๋ค. ์ด๋ฌํ ์ง์ ์ก์ธ์ค๋ ์น์์ ์ด์ ์ ์ฌ์ฉํ ์ ์์๋ ์๋นํ ์ฑ๋ฅ ํฅ์๊ณผ ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
WebCodecs๋ ๋ฌด์์ ๋๊น?
๋ณธ์ง์ ์ผ๋ก WebCodecs๋ ๊ณ ๊ธ HTML <video> ์์์ ๋ฎ์ ์์ค์ ๋ฏธ๋์ด ํ๋์จ์ด ๊ฐ์ ๊ฒฉ์ฐจ๋ฅผ ํด์ํฉ๋๋ค. VideoDecoder, VideoEncoder, AudioDecoder ๋ฐ AudioEncoder์ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๋
ธ์ถํ์ฌ ๊ฐ๋ฐ์๊ฐ ์์ถ๋ ๋ฏธ๋์ด๋ฅผ ์์ ํ๋ ์์ผ๋ก ๋์ฝ๋ฉํ๊ฑฐ๋ ์์ ํ๋ ์์ ์์ถ๋ ๋ฏธ๋์ด๋ก ์ธ์ฝ๋ฉํ ์ ์๋๋ก ํฉ๋๋ค. ์ด ๋ชจ๋ ์์
์ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ ์ด๋ฃจ์ด์ง๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ์ง์ ์ฒ๋ฆฌ, ํ์ ๋ณํ ๋๋ ๋์ ์คํธ๋ฆผ ์กฐ์์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์
์ ํ์์ ์
๋๋ค.
VideoFrame ๊ฐ์ฒด: ํฝ์
์ ๋ํ ์ฐฝ
VideoFrame ๊ฐ์ฒด๋ ํ๋ ์ ๋จ์ ๋น๋์ค ์กฐ์์ ํต์ฌ์
๋๋ค. ์ด๋ ๋จ์ผ ๋น์์ถ ๋น๋์ค ํ๋ ์์ ๋ํ๋ด๋ฉฐ, ํฝ์
๋ฐ์ดํฐ, ์น์, ํ์ ๋ฐ ํ์์คํฌํ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋น๋์ค ์คํธ๋ฆผ์ ํน์ ์๊ฐ์ ๋ํ ๋ชจ๋ ํ์ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์ปจํ
์ด๋๋ผ๊ณ ์๊ฐํ์ญ์์ค.
VideoFrame์ ์ฃผ์ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
format: ํฝ์ ํ์(์: 'I420', 'RGBA', 'NV12')์ ์ค๋ช ํฉ๋๋ค.codedWidth/codedHeight: ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ๋ ๋น๋์ค ํ๋ ์์ ์น์์ ๋๋ค.displayWidth/displayHeight: ์ข ํก๋น๋ฅผ ๊ณ ๋ คํ์ฌ ํ๋ ์์ ํ์ํด์ผ ํ๋ ์น์์ ๋๋ค.timestamp: ๋๊ธฐํ์ ์ค์ํ ๋ง์ดํฌ๋ก์ด ๋จ์์ ํ๋ ์ ํ ์ด์ ํ์์คํฌํ(PTS)์ ๋๋ค.duration: ๋ง์ดํฌ๋ก์ด ๋จ์์ ํ๋ ์ ์ง์ ์๊ฐ์ ๋๋ค.alpha: ํ๋ ์์ ์ํ ์ฑ๋(ํฌ๋ช ๋)์ด ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค.data: ์ง์ ์ ์ธ ์์ฑ์ ์๋์ง๋งcopyTo()์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ํฝ์ ๋ฒํผ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
VideoFrame์ ๋ํ ์ง์ ์ก์ธ์ค๊ฐ ์ ๊ทธ๋ ๊ฒ ํ์ ์ ์ธ๊ฐ์? ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ์ฒ๋ฆฌ ์ํ: ๋ผ์ด๋ธ ๋น๋์ค ์คํธ๋ฆผ์ ํํฐ, ๋ณํ ๋ฐ AI/ML ๋ชจ๋ธ์ ์ ์ฉํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ํ์ดํ๋ผ์ธ ์์ฑ: ํ์ค ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ ๋์ด์ ๊ณ ์ ํ ์ธ์ฝ๋ฉ, ๋์ฝ๋ฉ ๋ฐ ๋ ๋๋ง ์ํฌํ๋ก๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ ๋ก ์นดํผ ์์ ๋ฐ ํ๋์จ์ด ๊ฐ์์ ํ์ฉํฉ๋๋ค.
- ์ํธ ์์ฉ์ฑ ํฅ์: ์ด์ ์๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ง ๊ฐ๋ฅํ๋ ํ๋ถํ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ๋น๋์ค ๊ฒฝํ์ ๊ตฌ์ถํฉ๋๋ค.
VideoFrame์ ํฌํจํ WebCodecs์ ๋ํ ๋ธ๋ผ์ฐ์ ์ง์์ Chrome, Edge, Firefox์ ๊ฐ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ ฅํ๋ฏ๋ก ์ค๋๋ ๊ธ๋ก๋ฒ ๋ฐฐํฌ๋ฅผ ์ํ ์คํ ๊ฐ๋ฅํ ๊ธฐ์ ์
๋๋ค.
ํต์ฌ ๊ฐ๋
๋ฐ ์ํฌํ๋ก: VideoFrame ์์ , ์ฒ๋ฆฌ ๋ฐ ์ถ๋ ฅ
VideoFrame์ผ๋ก ์์
ํ๋ ๊ฒ์ ํ๋ ์์ ์์ ํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์์ ๋ ํ๋ ์์ ์ถ๋ ฅํ๋ 3๋จ๊ณ ํ์ดํ๋ผ์ธ์ ํฌํจํฉ๋๋ค. ํจ๊ณผ์ ์ธ ๋น๋์ค ์กฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ค๋ฉด ์ด ์ํฌํ๋ก๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
1. VideoFrame ์์
VideoFrame ๊ฐ์ฒด๋ฅผ ์ป๋ ๋ช ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
-
MediaStreamTrack์์: ์ด๋ ๋ผ์ด๋ธ ์นด๋ฉ๋ผ ํผ๋, ํ๋ฉด ๊ณต์ ๋๋ WebRTC ์คํธ๋ฆผ์ ์ผ๋ฐ์ ์ ๋๋ค.MediaStreamTrackProcessorAPI๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋์ค ํธ๋์์ ์ง์ VideoFrame๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์์ ์น์บ ์บก์ฒ:
const mediaStream = await navigator.mediaDevices.getUserMedia({ video: true }); const track = mediaStream.getVideoTracks()[0]; const processor = new MediaStreamTrackProcessor({ track }); const readableStream = processor.readable; // ์ด์ 'readableStream'์์ VideoFrames๋ฅผ ์ฝ์ ์ ์์ต๋๋ค -
VideoDecoder์์: ์์ถ๋ ๋น๋์ค ๋ฐ์ดํฐ(์: MP4 ํ์ผ ๋๋ ์ธ์ฝ๋ฉ๋ ํ๋ ์ ์คํธ๋ฆผ)๊ฐ ์๋ ๊ฒฝ์ฐVideoDecoder๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณVideoFrame์ผ๋ก ์์ถ์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ฏธ๋ฆฌ ๋ นํ๋ ์ฝํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
const decoder = new VideoDecoder({ output: frame => { /* 'frame' ์ฒ๋ฆฌ */ }, error: error => console.error(error) }); // ... ์ธ์ฝ๋ฉ๋ ์ฒญํฌ๋ฅผ decoder.decode()๋ก ๊ณต๊ธ -
์์ ๋ฐ์ดํฐ์์ ์์ฑ: ๋ฉ๋ชจ๋ฆฌ์ ์์ ํฝ์
๋ฐ์ดํฐ์์ ์ง์
VideoFrame์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ ํ๋ ์์ ์ ์ฐจ์ ์ผ๋ก ์์ฑํ๊ฑฐ๋ ๋ค๋ฅธ ์์ค(์: WebAssembly ๋ชจ๋)์์ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
const rawData = new Uint8ClampedArray(width * height * 4); // RGBA data // ... rawData ์ฑ์ฐ๊ธฐ const frame = new VideoFrame(rawData, { format: 'RGBA', width: width, height: height, timestamp: Date.now() * 1000 // ๋ง์ดํฌ๋ก์ด });
2. VideoFrame ์ฒ๋ฆฌ
VideoFrame์ ์ป์ผ๋ฉด ์ง์ ํ ์กฐ์์ ํ์ด ์์๋ฉ๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ธ ์ฒ๋ฆฌ ๊ธฐ์ ์
๋๋ค.
-
ํฝ์
๋ฐ์ดํฐ ์ก์ธ์ค(
copyTo(),transferTo()): ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ๋ ค๋ฉดcopyTo()์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋ก ๋ณต์ฌํ๊ฑฐ๋ Web Worker ๋๋ WebGPU/WebGL ์ปจํ ์คํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ํนํ ์ ๋ก ์นดํผ ์์ ์ ์ํดtransferTo()๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ์ง์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ ์ ์์ต๋๋ค.
const data = new Uint8Array(frame.allocationSize()); await frame.copyTo(data, { layout: [{ offset: 0, stride: frame.codedWidth * 4 }] }); // 'data'์๋ ์ด์ ์์ ํฝ์ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค(์: ์ผ๋ฐ์ ์ธ ํ์์ ๊ฒฝ์ฐ RGBA) // ... 'data' ์กฐ์ // ๊ทธ๋ฐ ๋ค์ ์กฐ์๋ ๋ฐ์ดํฐ์์ ์ VideoFrame์ ์์ฑํฉ๋๋ค - ์ด๋ฏธ์ง ์กฐ์: ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์์ ํ๋ฉด ๋ค์ํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ํํฐ(๊ทธ๋ ์ด์ค์ผ์ผ, ์ธํผ์, ํ๋ฆผ), ํฌ๊ธฐ ์กฐ์ , ์๋ฅด๊ธฐ, ์์ ๋ณด์ ๋ฐ ๋์ฑ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ ๋ณํ์ ์ํํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ์ฌ์ฉ์ ์ง์ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
Canvas ํตํฉ:
VideoFrame์ ์ฒ๋ฆฌํ๋ ๋งค์ฐ ์ผ๋ฐ์ ์ด๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ด๋ฅผHTMLCanvasElement๋๋OffscreenCanvas์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๋๋ค. ์บ๋ฒ์ค์ ์์ผ๋ฉด ๋๋ก์, ํผํฉ ๋ฐ ํฝ์ ์กฐ์(getImageData(),putImageData())์ ๋ํ ๊ฐ๋ ฅํCanvasRenderingContext2DAPI๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ทธ๋ํฝ ์ค๋ฒ๋ ์ด๋ฅผ ์ ์ฉํ๊ฑฐ๋ ์ฌ๋ฌ ๋น๋์ค ์์ค๋ฅผ ๊ฒฐํฉํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
const canvas = document.createElement('canvas'); canvas.width = frame.displayWidth; canvas.height = frame.displayHeight; const ctx = canvas.getContext('2d'); ctx.drawImage(frame, 0, 0, canvas.width, canvas.height); // ์ด์ ์บ๋ฒ์ค ๊ธฐ๋ฐ ํจ๊ณผ๋ฅผ ์ ์ฉํ๊ฑฐ๋ ctx.getImageData()์์ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. // ์บ๋ฒ์ค์์ ์ VideoFrame์ ๋ง๋ค๋ ค๋ฉด: const newFrame = new VideoFrame(canvas, { timestamp: frame.timestamp }); -
WebGPU/WebGL ํตํฉ: ๊ณ ๋๋ก ์ต์ ํ๋๊ณ ๋ณต์กํ ์๊ฐ ํจ๊ณผ๋ฅผ ์ํด
VideoFrame์ WebGPU ๋๋ WebGL ํ ์ค์ฒ๋ก ํจ์จ์ ์ผ๋ก ์ ์กํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ณ ๊ธ ์ค์๊ฐ ๋ ๋๋ง, 3D ํจ๊ณผ ๋ฐ ๋๊ท๋ชจ ๊ณ์ฐ ์์ ์ GPU ์ ฐ์ด๋(ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋)์ ์ฑ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ง์ ํ ์๋ค๋งํฑ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ํจ๊ณผ๊ฐ ๊ฐ๋ฅํด์ง๋๋ค. -
๊ณ์ฐ ์์
(AI/ML ์ถ๋ก ):
VideoFrame์ ์์ ํฝ์ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด ๊ฐ์ง, ์ผ๊ตด ์ธ์, ์์ธ ์ถ์ ๋๋ ์ค์๊ฐ ๋ถํ (์: ๋ฐฐ๊ฒฝ ์ ๊ฑฐ)๊ณผ ๊ฐ์ ์์ ์ ๋ํ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ(์: TensorFlow.js)์ ์ง์ ๊ณต๊ธํ ์ ์์ต๋๋ค.
3. VideoFrame ์ถ๋ ฅ
์ฒ๋ฆฌ ํ์๋ ์ผ๋ฐ์ ์ผ๋ก ์์ ๋ VideoFrame์ ํ์, ์ธ์ฝ๋ฉ ๋๋ ์คํธ๋ฆฌ๋ฐํ๋ ค๋ ๊ฒ์
๋๋ค.
-
VideoEncoder๋ก: ํ๋ ์์ ์์ ํ๊ณ ๋ค์ ์ธ์ฝ๋ฉํ๋ ค๋ ๊ฒฝ์ฐ(์: ํฌ๊ธฐ ์ถ์, ํ์ ๋ณ๊ฒฝ ๋๋ ์คํธ๋ฆฌ๋ฐ ์ค๋น)VideoEncoder์ ๊ณต๊ธํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์ ์ง์ ํธ๋์ค์ฝ๋ฉ ํ์ดํ๋ผ์ธ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
const encoder = new VideoEncoder({ output: chunk => { /* ์ธ์ฝ๋ฉ๋ ์ฒญํฌ ์ฒ๋ฆฌ */ }, error: error => console.error(error) }); // ... ์ฒ๋ฆฌ ํ newFrame ์ธ์ฝ๋ฉ encoder.encode(newFrame); -
ImageBitmap์ผ๋ก(ํ์์ฉ): ์บ๋ฒ์ค ๋๋ ์ด๋ฏธ์ง ์์์ ์ง์ ํ์ํ๋ ค๋ฉดVideoFrame์ImageBitmap์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ฒด ์ฌ์ธ์ฝ๋ฉ ์์ด ํ๋ ์์ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
const imageBitmap = await createImageBitmap(frame); // ํ์๋ฅผ ์ํด canvas์ imageBitmap ๊ทธ๋ฆฌ๊ธฐ -
MediaStreamTrack์ผ๋ก: ํนํ WebRTC์์ ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐMediaStreamTrackGenerator๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋VideoFrame์MediaStreamTrack์ ๋ค์ ํธ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ์ ํ์ ๋๋ ๋ผ์ด๋ธ ๋ฐฉ์ก์์ ์ค์๊ฐ ๋น๋์ค ํจ๊ณผ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const generator = new MediaStreamTrackGenerator({ kind: 'video' }); const processedStream = new MediaStream([generator]); // ๊ทธ๋ฐ ๋ค์ ์ฒ๋ฆฌ ๋ฃจํ์์: const writableStream = generator.writable; const writer = writableStream.getWriter(); // ... newFrame์ ํ๋ ์ ์ฒ๋ฆฌ writer.write(newFrame);
์ค์ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฐ ์ฌ์ฉ ์ฌ๋ก: ๊ธ๋ก๋ฒ ๊ด์
VideoFrame ์ฒ๋ฆฌ์ ๊ธฐ๋ฅ์ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ๋ํํ ๋ฐ ์ง๋ฅํ ๋น๋์ค ๊ฒฝํ์ ์๋ก์ด ์๋๋ฅผ ์ด์ด ์ ์ธ๊ณ์ ๋ค์ํ ์ฐ์
๋ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์์
๋๋ค.
1. ๊ณ ๊ธ ํ์ ํ์ ๋ฐ ์ปค๋ฎค๋์ผ์ด์ ํ๋ซํผ
๋น๋์ค ํตํ์ ์์กดํ๋ ์ ์ธ๊ณ์ ์กฐ์ง, ๊ต์ก์ ๋ฐ ๊ฐ์ธ์๊ฒ VideoFrame์ ํ์ ์ถ์ข
์ ๋ถํํ๋ ์ฌ์ฉ์ ์ง์ ์ ์ ๊ณตํฉ๋๋ค.
-
์ค์๊ฐ ๋ฐฐ๊ฒฝ ๋ฐ๊พธ๊ธฐ: ์ฌ์ฉ์๋ ์ค์ ๋ฐฐ๊ฒฝ์ ๊ฐ์ ๋ฐฐ๊ฒฝ(์ด๋ฏธ์ง, ๋น๋์ค, ํ๋ฆผ ํจ๊ณผ)์ผ๋ก ๋ฐ๊ฟ ์ ์์ผ๋ฉฐ, ๋
น์ ํ๋ฉด์ด๋ ๊ฐ๋ ฅํ ๋ก์ปฌ ํ๋์จ์ด ์์ด๋ ์๊ฒฉ ์์
์์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฐ ์ ๋ฌธ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์: ์ธ๋์ ์ํํธ์จ์ด ๊ฐ๋ฐ์๋ ์ ๋ฌธ์ ์ธ ์ฌ๋ฌด์ค ๋ฐฐ๊ฒฝ์ผ๋ก ์ง์์ ๊ธ๋ก๋ฒ ํ ํ์์ ์ฐธ์ํ๊ฑฐ๋, ๋ธ๋ผ์ง์ ๊ต์ฌ๋ ์จ๋ผ์ธ ์์ ์ ๋งค๋ ฅ์ ์ธ ๊ต์ก ๋ฐฐ๊ฒฝ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
์ฆ๊ฐ ํ์ค(AR) ํํฐ ๋ฐ ํจ๊ณผ: ์ค์๊ฐ์ผ๋ก ์ผ๊ตด์ ๊ฐ์ ์ก์ธ์๋ฆฌ, ๋ฉ์ดํฌ์
๋๋ ์บ๋ฆญํฐ ์ค๋ฒ๋ ์ด๋ฅผ ์ถ๊ฐํ์ฌ ์ ์ธ๊ณ ์์
๋ฏธ๋์ด ๋ฐ ์ํฐํ
์ธ๋จผํธ ์ฑ์์ ์ฐธ์ฌ์ ๊ฐ์ธํ๋ฅผ ํฅ์์ํต๋๋ค.
์: ๋ค๋ฅธ ์๊ฐ๋์ ์๋ ์น๊ตฌ๋ค์ ์ฌ๋ฏธ์๋ ๋๋ฌผ ํํฐ๋ ๋์ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํ๋ฅผ ๊ฐ์ธํํ ์ ์๊ฑฐ๋, ์ ๋ฝ์ ๊ฐ์ ํจ์ ์ปจ์คํดํธ๋ ์์์์ ํด๋ผ์ด์ธํธ์ ๋ผ์ด๋ธ ๋น๋์ค ํผ๋์์ ์ก์ธ์๋ฆฌ๋ฅผ ์์ฐํ ์ ์์ต๋๋ค.
-
๋
ธ์ด์ฆ ๊ฐ์ ๋ฐ ๋น๋์ค ํฅ์: ์กฐ๋ช
์ด ์ด๋ก๊ฑฐ๋ ์ด์์ ์ธ ์นด๋ฉ๋ผ ์ค์ ์ด ์๋ ๊ฒฝ์ฐ ๋
ธ์ด์ฆ๊ฐ ๋ง์ ๋น๋์ค ํผ๋๋ฅผ ์ ๋ฆฌํ๋ ๋ฐ ํํฐ๋ฅผ ์ ์ฉํ์ฌ ๋ชจ๋ ์ฐธ๊ฐ์์ ๋น๋์ค ํ์ง์ ํฅ์์ํต๋๋ค.
์: ์กฐ๋ช ์ด ์ ํ๋ ์๊ฒฉ ์์น์์ ๋ณด๊ณ ํ๋ ๊ธฐ์๋ ๋น๋์ค ํผ๋๋ฅผ ์๋์ผ๋ก ๋ฐ๊ฒ ํ๊ณ ๋ ธ์ด์ฆ๋ฅผ ์ ๊ฑฐํ์ฌ ๊ธ๋ก๋ฒ ๋ด์ค ์ฒญ์ค์๊ฒ ๋ ์ ๋ช ํ ์ ์ก์ ์ ๊ณตํ ์ ์์ต๋๋ค.
-
์ฌ์ฉ์ ์ง์ ํ๋ฉด ๊ณต์ ์ค๋ฒ๋ ์ด: ํ๋ ์ ํ
์ด์
์ค์ ์ค์๊ฐ์ผ๋ก ๊ณต์ ํ๋ฉด์ ํ์ดํ, ๊ฐ์กฐ ํ์ ๋๋ ์ฌ์ฉ์ ์ง์ ๋ธ๋๋ฉ์ ์ถ๊ฐํ์ฌ ๊ตญ์ ํ์ ๋ช
ํ์ฑ๊ณผ ์ปค๋ฎค๋์ผ์ด์
์ ํฅ์์ํต๋๋ค.
์: ์ผ๋ณธ์ ํ๋ก์ ํธ ๊ด๋ฆฌ์๋ ๋ถ์ฐ๋ ํ์ ๊ธฐ์ ๋ค์ด์ด๊ทธ๋จ์ ์ ์ํ์ฌ ํน์ ๊ตฌ์ฑ ์์์ ์ค์๊ฐ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ผ ์ ์๋ ๋ฐ๋ฉด, ์บ๋๋ค์ ๋์์ด๋๋ ํธ์ฃผ์ ํด๋ผ์ด์ธํธ์ UI ๋ชจํ์ ๊ณต๋ ์์ ํ ์ ์์ต๋๋ค.
2. ๋ํํ ์คํธ๋ฆฌ๋ฐ ๋ฐ ๋ฐฉ์ก ํ๋ซํผ
๋ผ์ด๋ธ ์คํธ๋ฆฌ๋จธ, ์ฝํ
์ธ ์ ์์ ๋ฐ ๋ฐฉ์ก์ฌ์๊ฒ VideoFrame์ ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌธ๊ฐ ์์ค์ ํ๋ก๋์
๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
-
๋์ ์ค๋ฒ๋ ์ด ๋ฐ ๊ทธ๋ํฝ: ์๋ฒ ์ธก ๋ ๋๋ง ์์ด ๋ผ์ด๋ธ ๋ฐ์ดํฐ(์: ์คํฌ์ธ ์ ์, ์ฌ๋ฌด ํฐ์ปค, ์์
๋ฏธ๋์ด ๋๊ธ), ๋ํํ ์ค๋ฌธ ์กฐ์ฌ ๋๋ ์ฌ์ฉ์ ์ง์ ๋ธ๋๋ฉ ๊ทธ๋ํฝ์ ๋ผ์ด๋ธ ๋น๋์ค ์คํธ๋ฆผ์ ์ค์ฒฉํฉ๋๋ค.
์: ์ํ๋ฆฌ์นด์์ ์คํธ๋ฆฌ๋ฐํ๋ ๋ผ์ด๋ธ ์คํฌ์ธ ํด์ค์๋ ์ ๋ฝ๊ณผ ์๋ฉ๋ฆฌ์นด ๋๋ฅ์์ ์์ฒญํ๋ ์์ฒญ์๋ฅผ ์ํด ๊ฒ์ ์์ ์์ ์ค์๊ฐ ์ ์ ํต๊ณ ๋ฐ ์ฒญ์ค ์ค๋ฌธ ์กฐ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ํ์ํ ์ ์์ต๋๋ค.
-
๊ฐ์ธํ๋ ์ฝํ
์ธ ์ ๋ฌ: ์์ฒญ์ ์ธ๊ตฌ ํต๊ณ, ์์น ๋๋ ์ํธ ์์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ค์๊ฐ์ผ๋ก ๋น๋์ค ์ฝํ
์ธ ๋๋ ๊ด๊ณ ๋ฅผ ๋ง์ถคํํ์ฌ ๋ ๋งค๋ ฅ์ ์ด๊ณ ๊ด๋ จ์ฑ ์๋ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
์: ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ ๋ค๋ฅธ ์ง์ญ์ ์์ฒญ์๋ฅผ ์ํด ๋ผ์ด๋ธ ์ ํ ์์ฐ ๋น๋์ค์ ๋ก์ปฌํ๋ ์ ํ ํ๋ก๋ชจ์ ๋๋ ํตํ ์ ๋ณด๋ฅผ ์ง์ ํ์ํ ์ ์์ต๋๋ค.
-
๋ผ์ด๋ธ ์ค์ฌ ๋ฐ ๊ฒ์ด: ๋ผ์ด๋ธ ๋ฐฉ์ก ์ค์ ๋ถ์ ์ ํ ์ฝํ
์ธ (์ผ๊ตด, ํน์ ๊ฐ์ฒด, ๋ฏผ๊ฐํ ์ด๋ฏธ์ง)๋ฅผ ์ค์๊ฐ์ผ๋ก ์๋์ผ๋ก ๊ฐ์งํ๊ณ ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ฐจ๋จํ์ฌ ๋ค์ํ ๊ธ๋ก๋ฒ ์ฝํ
์ธ ํ์ค์ ์ค์ํฉ๋๋ค.
์: ์ฌ์ฉ์ ์์ฑ ๋ผ์ด๋ธ ์คํธ๋ฆผ์ ํธ์คํ ํ๋ ํ๋ซํผ์ ๋ฏผ๊ฐํ ๊ฐ์ธ ์ ๋ณด ๋๋ ๋ถ์ ์ ํ ์ฝํ ์ธ ๋ฅผ ์๋์ผ๋ก ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ์ฌ ๊ธ๋ก๋ฒ ์์ฒญ์๋ฅผ ์ํ ์์ ํ ์์ฒญ ํ๊ฒฝ์ ์ ์งํ ์ ์์ต๋๋ค.
3. ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ํฌ๋ฆฌ์์ดํฐ๋ธ ๋๊ตฌ ๋ฐ ๋น๋์ค ํธ์ง
์ ์ธ๊ณ ๋ชจ๋ ์ฅ์น์์ ์ก์ธ์คํ ์ ์๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ๊ฐ๋ ฅํ ํธ์ง ๊ธฐ๋ฅ์ ํตํด ์ ์์ ๋ฐ ์ ๋ฌธ๊ฐ์๊ฒ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
-
์ค์๊ฐ ํํฐ ๋ฐ ์์ ๊ทธ๋ ์ด๋ฉ: ๋ฐ์คํฌํฑ ๋น๋์ค ํธ์ง ์ํํธ์จ์ด์ ์ ์ฌํ๊ฒ ์ ๋ฌธ์ ์ธ ์์ ๋ณด์ , ์๋ค๋งํฑ ํํฐ ๋๋ ์คํ์ผ ํจ๊ณผ๋ฅผ ๋น๋์ค ํด๋ฆฝ์ ์ฆ์ ์ ์ฉํฉ๋๋ค.
์: ํ๋์ค์ ์ํ ์ ์์๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ํธ์ง๊ธฐ์์ ์์ ์ ์์ ์์์ ๋ค์ํ ์์ ํ๋ ํธ๋ฅผ ๋น ๋ฅด๊ฒ ๋ฏธ๋ฆฌ ๋ณผ ์ ์์ผ๋ฉฐ, ํ๊ตญ์ ๊ทธ๋ํฝ ๋์์ด๋๋ ์น ํ๋ก์ ํธ์ ๋น๋์ค ์์์ ์์ ์ ํจ๊ณผ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
-
์ฌ์ฉ์ ์ง์ ์ ํ ๋ฐ ์๊ฐ ํจ๊ณผ(VFX): ๋น์ผ ๋ฐ์คํฌํฑ ์ํํธ์จ์ด์ ๋ํ ์์กด๋๋ฅผ ์ค์ด๋ฉด์ ๊ณ ์ ํ ๋น๋์ค ์ ํ์ ๊ตฌํํ๊ฑฐ๋ ๋ณต์กํ ์๊ฐ ํจ๊ณผ๋ฅผ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค.
์: ์๋ฅดํจํฐ๋์ ํ์์ ๊ฐ๋ฒผ์ด ์น ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํฐ๋ฏธ๋์ด ํ๋ ์ ํ ์ด์ ์ ๋ง๋ค ๋ ๋น๋์ค ์ธ๊ทธ๋จผํธ ๊ฐ์ ์ฌ์ฉ์ ์ง์ ์ ๋๋ฉ์ด์ ์ ํ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
-
๋น๋์ค ์
๋ ฅ์ ํตํ ์์ฑ ์์ : ์นด๋ฉ๋ผ ์
๋ ฅ์ ํ๋ ์ ๋จ์๋ก ์ฒ๋ฆฌํ์ฌ ๊ณ ์ ํ ๊ทธ๋ํฝ ์ถ๋ ฅ์ ์์ฑํ๋ ์ถ์ ์์ , ์๊ฐํ ๋๊ตฌ ๋๋ ๋ํํ ์ค์น๋ฅผ ๋ง๋ญ๋๋ค.
์: ์ผ๋ณธ์ ์์ ๊ฐ๋ ์ ์ธ๊ณ ์น ๋งํฌ๋ฅผ ํตํด ์ก์ธ์คํ ์ ์๋ ๋ผ์ด๋ธ ์น์บ ํผ๋๋ฅผ ํ๋ฅด๋ ์ถ์ํ ๊ทธ๋ฆผ์ผ๋ก ๋ณํํ๋ ๋ํํ ๋์งํธ ์ํธ ์ํ์ ๋ง๋ค ์ ์์ต๋๋ค.
4. ์ ๊ทผ์ฑ ํฅ์ ๋ฐ ๋ณด์กฐ ๊ธฐ์
๋ค์ํ ๊ธ๋ก๋ฒ ์ฒญ์ค์ ์ํด ๋น๋์ค ์ฝํ ์ธ ๋ฅผ ๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ํฌ๊ด์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
-
์ค์๊ฐ ์ํ ์ธ์/์ค๋ฒ๋ ์ด: ๋น๋์ค ํผ๋๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ํ ๋์์ ๊ฐ์งํ๊ณ ํด๋น ํ
์คํธ ๋๋ ๋ฒ์ญ๋ ์ค๋์ค๋ฅผ ์ฒญ๊ฐ ์ฅ์ ์ธ์ ์ํด ์ค์๊ฐ์ผ๋ก ์ค๋ฒ๋ ์ดํฉ๋๋ค.
์: ๋ผ์ด๋ธ ์จ๋ผ์ธ ๊ฐ์๋ฅผ ์์ฒญํ๋ ์ฒญ๊ฐ ์ฅ์ ์ธ์ ์ ์ธ๊ณ ์ด๋์์๋ ํ๋ฉด์ ๋ํ๋๋ ์ํ ํต์ญ์ฌ์ ์ค์๊ฐ ํ ์คํธ ๋ฒ์ญ์ ๋ณผ ์ ์์ต๋๋ค.
-
์๋งน ๋ณด์ ํํฐ: ์๋งน์ด ์๋ ์ฌ์ฉ์์ ์์ฒญ ํ๊ฒฝ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ค์๊ฐ์ผ๋ก ๋น๋์ค ํ๋ ์์ ํํฐ๋ฅผ ์ ์ฉํ์ฌ ์์์ ์กฐ์ ํฉ๋๋ค.
์: ๋ น์๊ณผ ๋นจ๊ฐ์์ ๋ ์ ๊ตฌ๋ณํ ์ ์๋๋ก ์์์ ์ด๋ํ์ฌ ์์ฐ ๋คํ๋ฉํฐ๋ฆฌ๋ฅผ ์์ฒญํ๋ ์์ฝ ํ์๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ํํฐ๋ฅผ ํ์ฑํํ์ฌ ํ๊ฒฝ์ ๋ํ ์ธ์์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
-
ํฅ์๋ ์บก์
๋ฐ ์๋ง: ๋ ๋์ ๋๊ธฐํ ๋๋ ์ปจํ
์คํธ ๋ถ์์ ์ํด ๋น๋์ค ์ฝํ
์ธ ์ ์ง์ ์ก์ธ์คํ์ฌ ๋ ์ ํํ๊ณ ๋์ ์ด๋ฉฐ ๊ฐ์ธํ๋ ์บก์
์์คํ
์ ๊ฐ๋ฐํฉ๋๋ค.
์: ํ์ต ํ๋ซํผ์ ๊ต์ก์ฉ ๋น๋์ค์ ๋ํด ํฅ์๋ ์ค์๊ฐ ๋ฒ์ญ๋ ์บก์ ์ ์ ๊ณตํ์ฌ ๋ค์ํ ์ธ์ด์ ๋ฐฐ๊ฒฝ์ ํ์๋ค์ด ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ์ฐธ์ฌํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
5. ๊ฐ์, ๋ชจ๋ํฐ๋ง ๋ฐ ์ฐ์ ์์ฉ ํ๋ก๊ทธ๋จ
๋ณด๋ค ์ง๋ฅ์ ์ด๊ณ ์ง์ญํ๋ ๋น๋์ค ๋ถ์์ ์ํด ํด๋ผ์ด์ธํธ ์ธก ์ฒ๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค.
-
์ด์ ๊ฐ์ง ๋ฐ ๊ฐ์ฒด ์ถ์ : ๋ชจ๋ ์์ ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ฐ๋๋ก ๋ณด๋ด์ง ์๊ณ ๋น์ ์์ ์ธ ํ๋์ ๋ํ ๋น๋์ค ํผ๋๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ถ์ํ๊ฑฐ๋ ํน์ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ์ฌ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ ํ๊ณ ๋์ญํญ์ ์ค์
๋๋ค.
์: ๋ ์ผ์ ์ ์กฐ ๊ณต์ฅ์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ๋น๋์ค ๋ถ์์ ์ฌ์ฉํ์ฌ ์กฐ๋ฆฝ ๋ผ์ธ์ ๊ฒฐํจ์ด๋ ์ด์ํ ์์ง์์ ์ํด ๋ก์ปฌ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ์ฆ์ ๊ฒฝ๊ณ ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค.
-
๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ง์คํน: ๋น๋์ค๊ฐ ๊ธฐ๋ก๋๊ฑฐ๋ ์ ์ก๋๊ธฐ ์ ์ ๋น๋์ค ์คํธ๋ฆผ ๋ด์์ ์ผ๊ตด์ด๋ ๋ฏผ๊ฐํ ์์ญ์ ์๋์ผ๋ก ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ๊ฑฐ๋ ํฝ์
ํํ์ฌ ๊ณต๊ณต ์ฅ์ ๋๋ ๊ท์ ์ฐ์
์์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์: ๊ณต๊ณต ์ฅ์์ ๋ณด์ ์์คํ ์ ๋น๋์ค๋ฅผ ๋ณด๊ดํ๊ธฐ ์ ์ ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ ์ ์ค์ํ๊ธฐ ์ํด ๋ นํ๋ ์์์์ ์ฃผ๋ณ ์ฌ๋๋ค์ ์ผ๊ตด์ ์๋์ผ๋ก ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๊ธฐ์ ์ ์ธ ์ฌ์ธต ๋ถ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
๊ฐ๋ ฅํ์ง๋ง VideoFrame์ผ๋ก ์์
ํ๋ ค๋ฉด ์ฑ๋ฅ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ
-
์ ๋ก ์นดํผ ์์
: ๊ฐ๋ฅํ๋ฉด ์ปจํ
์คํธ(๋ฉ์ธ ์ค๋ ๋, Web Worker, WebGPU) ๊ฐ์
VideoFrame๋ฐ์ดํฐ๋ฅผ ์ด๋ํ ๋ ์ ๋ก ์นดํผ ๋ฐ์ดํฐ ์ ์ก(์:transferTo())์ ํ์ฉํ์ญ์์ค. ์ด๋ ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ ๋๋ค. -
Web Worker: ์ ์ฉ Web Worker์์ ๋ง์ ๋น๋์ค ์ฒ๋ฆฌ ์์
์ ์ํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ณ์ฐ์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋ก๋ํ์ฌ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์๋ต์ฑ์ ์ ์งํฉ๋๋ค.
OffscreenCanvas๋ ํนํ ์บ๋ฒ์ค ๋ ๋๋ง์ด ์์ ์ ๋ด์์ ์์ ํ ์ํ๋๋๋ก ํ์ฌ ์ ์ฉํฉ๋๋ค. -
GPU ๊ฐ์(WebGPU, WebGL): ๊ณ์ฐ ์ง์ฝ์ ์ธ ๊ทธ๋ํฝ ํจ๊ณผ๋ฅผ ์ํด GPU๋ฅผ ํ์ฉํ์ญ์์ค.
VideoFrame์ WebGPU/WebGL ํ ์ค์ฒ๋ก ์ ์กํ๊ณ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ์ ์ํํฉ๋๋ค. ์ด๋ CPU ๊ธฐ๋ฐ ์บ๋ฒ์ค ์กฐ์๋ณด๋ค ํฝ์ ์์ค ์์ ์ ํจ์ฌ ๋ ํจ์จ์ ์ ๋๋ค. -
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ:
VideoFrame์ ๋น๊ต์ ํฐ ๊ฐ์ฒด์ ๋๋ค. ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ๋ฅผ ํด์ ํ๋ ค๋ฉดVideoFrame์ ์ฌ์ฉํ ํ ํญ์frame.close()๋ฅผ ํธ์ถํ์ญ์์ค. ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด ํนํ ์ฅ๊ธฐ๊ฐ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์ด๋น ๋ง์ ํ๋ ์์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. - ์ค๋กํ๋ง ๋ฐ ๋๋ฐ์ด์ฑ: ์ค์๊ฐ ์๋๋ฆฌ์ค์์๋ ํ๋ ์์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ์์ ํ ์ ์์ต๋๋ค. ์ค๋กํ๋ง ๋๋ ๋๋ฐ์ด์ฑ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ฌ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ด ์๋๋์ง ์๋๋ก ํ๊ณ ํ์ํ ๊ฒฝ์ฐ ํ๋ ์์ ์ ์์ ์ผ๋ก ์ญ์ ํฉ๋๋ค.
๋ณด์ ๋ฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ
-
๊ถํ: ์ฌ์ฉ์ ๋ฏธ๋์ด(์นด๋ฉ๋ผ, ๋ง์ดํฌ)์ ์ก์ธ์คํ๋ ค๋ฉด
navigator.mediaDevices.getUserMedia()๋ฅผ ํตํด ๋ช ์์ ์ธ ์ฌ์ฉ์ ๊ถํ์ด ํ์ํฉ๋๋ค. ๋ฏธ๋์ด์ ์ก์ธ์คํ ๋ ํญ์ ์ฌ์ฉ์์๊ฒ ๋ช ํํ ํ์๊ธฐ๋ฅผ ์ ๊ณตํ์ญ์์ค. - ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ๋น๋์ค ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ, ์ ์ฅ ๋๋ ์ ์ก๋๋ ๋ฐฉ์(ํนํ ์ฌ์ฉ์์ ์ฅ์น๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ)์ ๋ํด ํฌ๋ช ํ๊ฒ ์ค๋ช ํฉ๋๋ค. ๋์ ๊ณ ๊ฐ๊ณผ ๊ด๋ จ๋ GDPR, CCPA ๋ฐ ๊ธฐํ ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ๋ณดํธ ๊ท์ ์ ์ค์ํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ
๋ชจ๋ WebCodecs ๊ตฌ์ฑ ์์(๋์ฝ๋, ์ธ์ฝ๋, ํ๋ก์ธ์)์ ๋ํ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค. ๋ฏธ๋์ด ํ์ดํ๋ผ์ธ์ ๋ณต์กํ ์ ์์ผ๋ฉฐ ์ง์๋์ง ์๋ ํ์, ํ๋์จ์ด ์ ํ ๋๋ ์๋ชป๋ ๋ฐ์ดํฐ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฌ์ฉ์์๊ฒ ์๋ฏธ ์๋ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ญ์์ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฐ ํด๋ฐฑ
WebCodecs๊ฐ ์ ์ง์๋์ง๋ง ๊ธฐ๋ฅ ๊ฐ์ง(์: if ('VideoFrame' in window) { ... })๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ํ์ธํ๋ ๊ฒ์ด ํญ์ ์ข์ต๋๋ค. WebCodecs๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ธ๋ผ์ฐ์ ๋๋ ํ๊ฒฝ์ ๊ฒฝ์ฐ ์๋ฒ ์ธก ์ฒ๋ฆฌ ๋๋ ๋ ๊ฐ๋จํ ํด๋ผ์ด์ธํธ ์ธก ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ ์์ ์ธ ํด๋ฐฑ์ ๊ณ ๋ คํ์ญ์์ค.
๊ธฐํ API์์ ํตํฉ
VideoFrame์ ์ง์ ํ ์ฑ๋ฅ์ ์ข
์ข
๋ค๋ฅธ ์น API์์ ์๋์ง ํจ๊ณผ์์ ๋น๋กฏ๋ฉ๋๋ค.
- WebRTC: ํ์ ํ์์์ ๋น๋์ค ํ๋ ์์ ์ค์๊ฐ์ผ๋ก ์ง์ ์กฐ์ํ์ฌ ์ฌ์ฉ์ ์ง์ ํจ๊ณผ, ๋ฐฐ๊ฒฝ ๋ฐ๊พธ๊ธฐ ๋ฐ ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
WebAssembly(Wasm): ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์ฑ๋ฅ์ ์ด์ ์ ์ป๋ ๊ณ ๋๋ก ์ต์ ํ๋๊ฑฐ๋ ๋ณต์กํ ํฝ์
์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ Wasm ๋ชจ๋์
VideoFrame์ ์์ฑํ๊ธฐ ์ ํ์ ์์ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. - Web Audio API: ์์ ํ ๋ฏธ๋์ด ํ์ดํ๋ผ์ธ ์ ์ด๋ฅผ ์ํด ๋น๋์ค ์ฒ๋ฆฌ๋ฅผ ์ค๋์ค ์กฐ์๊ณผ ๋๊ธฐํํฉ๋๋ค.
- IndexedDB/Cache API: ์คํ๋ผ์ธ ์ก์ธ์ค ๋๋ ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ์ํด ์ฒ๋ฆฌ๋ ํ๋ ์ ๋๋ ์ฌ์ ๋ ๋๋ง๋ ์์ ์ ์ ์ฅํฉ๋๋ค.
WebCodecs ๋ฐ VideoFrame์ ๋ฏธ๋
WebCodecs API, ํนํ VideoFrame ๊ฐ์ฒด๋ ๊ณ์ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ตฌํ์ด ์ฑ์๋๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋จ์ ๋ฐ๋ผ ๋์ฑ ์ ๊ตํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค. ์ถ์ธ๋ ๋ ๋ง์ ๋ธ๋ผ์ฐ์ ์ธก ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ํฅ์์ํค๊ณ , ์๋ฒ ์ธํ๋ผ์ ๋ํ ์์กด๋๋ฅผ ์ค์ด๊ณ , ๊ฐ๋ฐ์๊ฐ ๋ ํ๋ถํ๊ณ ์ํธ ์์ฉ์ ์ด๋ฉฐ ๊ฐ์ธํ๋ ๋ฏธ๋์ด ๊ฒฝํ์ ๋ง๋ค ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค.
์ด๋ฌํ ๋น๋์ค ์ฒ๋ฆฌ์ ๋ฏผ์ฃผํ๋ ์๋นํ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ์ด๋ ์ด์ ์๋ ์ธํ๋ผ ๋๋ ํน์ ์ํํธ์จ์ด์ ์๋นํ ํฌ์๊ฐ ํ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ์ ํ๊ณผ ๊ฐ๋ณ ๊ฐ๋ฐ์๊ฐ ์ด์ ๊ตฌ์ถํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ํฐํ ์ธ๋จผํธ ๋ฐ ๊ต์ก์์ ์ปค๋ฎค๋์ผ์ด์ ๋ฐ ์ฐ์ ๋ชจ๋ํฐ๋ง์ ์ด๋ฅด๊ธฐ๊น์ง ํ์ ์ ์ด์งํ์ฌ ๊ณ ๊ธ ๋น๋์ค ์กฐ์์ ์ ์ธ๊ณ ์ ์์ ๋ฐ ์ฌ์ฉ์ ์ปค๋ฎค๋ํฐ์์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค.
๊ฒฐ๋ก
WebCodecs VideoFrame ์ฒ๋ฆฌ๋ ์น ๊ธฐ๋ฐ ๋น๋์ค์ ๋ํ ๊ธฐ๋
๋น์ ์ธ ๋์ฝ์ ๋ํ๋
๋๋ค. ๊ฐ๋ณ ๋น๋์ค ํ๋ ์์ ๋ํ ์ง์ ์ ์ด๊ณ ํจ์จ์ ์ด๋ฉฐ ๋ฎ์ ์์ค์ ์ก์ธ์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์คํ๋๋ ์ ๊ตํ ์ค์๊ฐ ๋น๋์ค ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ก์ด ์๋๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ํฅ์๋ ํ์ ํ์ ๋ฐ ๋ํํ ์คํธ๋ฆฌ๋ฐ์์ ๊ฐ๋ ฅํ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ํธ์ง ์ ํ๊ตฐ ๋ฐ ๊ณ ๊ธ ์ ๊ทผ์ฑ ๋๊ตฌ์ ์ด๋ฅด๊ธฐ๊น์ง ์ ์ฌ๋ ฅ์ ๊ด๋ํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
VideoFrame์ ์์ํ ๋ ์ฑ๋ฅ ์ต์ ํ, ์ ์คํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ค์์ฑ์ ๊ธฐ์ตํ์ญ์์ค. Web Worker, WebGPU ๋ฐ ๊ธฐํ ๋ณด์์ ์ธ API์ ์ฑ๋ฅ์ ํ์ฉํ์ฌ ์ด ํฅ๋ฏธ๋ก์ด ๊ธฐ์ ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ธ ํด์ ํ์ญ์์ค. ์น ๋น๋์ค์ ๋ฏธ๋๊ฐ ์ฌ๊ธฐ์ ์์ผ๋ฉฐ, ๊ทธ ์ด๋ ๋๋ณด๋ค ๋ ๋ํํ์ ์ด๊ณ ์ง๋ฅ์ ์ด๋ฉฐ ์ ๊ทผ์ฑ์ด ์ข์ต๋๋ค. ์ค๋ ์คํํ๊ณ , ๊ตฌ์ถํ๊ณ , ํ์ ์ ์์ํ์ธ์. ๊ธ๋ก๋ฒ ๋ฌด๋๊ฐ ์ฌ๋ฌ๋ถ์ ์ฐฝ์๋ฌผ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.